package skladowisko.generator;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Random;
import skladowisko.Kontener;
import skladowisko.ParametryFizyczne;
import skladowisko.ParametryPrzeznaczenie;
import skladowisko.Terminal;
import skladowisko.dictonaries.StatusObiektu;
import skladowisko.dictonaries.TypKontenera;
import skladowisko.transport.TransportPrzychodzacy;

/**
 *
 * @author kedziers
 */
public class TerminalGenerator
{
    private static int W = 5;

    private Terminal terminal;
    
    private Date minPrzybycie;
    private Date maxPrzybycie;

    private ModelGeneracji model;

    public TerminalGenerator(ModelGeneracji model)
    {
        this.model = model;
        initDates();
        initTerminal();
    }

    private void initTerminal()
    {
        terminal = new Terminal();

        W = model.getSkladowiska().get(0).getW();
        for(SkladowiskoMetaData meta : model.getSkladowiska())
        {
            terminal.addSkladowisko(meta.utworzSkladowisko());
        }
    }

    private void initDates()
    {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(new Date());

        calendar.add(Calendar.DAY_OF_MONTH, -1);
        setMaxPrzybycie(calendar.getTime());
        calendar.add(Calendar.DAY_OF_MONTH, -10);
        setMinPrzybycie(calendar.getTime());
    }

    public Terminal generujTerminal(double stopienZapelnienia, StrategiaRozmieszczania strategia)
    {
        terminal.zeruj();
        //initTerminal();

        int iloscMiejsc = terminal.getIloscMiejsc()*W;
        int iloscKontenerow = (int)(iloscMiejsc*stopienZapelnienia);

        List<Kontener> kontenery = generujKontenery(iloscKontenerow);

        Rozmieszczacz rozmieszczacz = RozmieszczaczFactory.utworzRozmieszczacz(strategia);
        
        rozmieszczacz.zapelnijTerminal(terminal, kontenery);

        return terminal;
    }


    private List<Kontener> generujKontenery(int iloscKontenerow)
    {
        List<Kontener> wynik = new ArrayList<Kontener>();

        int nextId = 1;
        for(int i=0;i<iloscKontenerow;i++)
        {
            Kontener k = new Kontener(new ParametryFizyczne(TypKontenera.T40, -1));
            TransportPrzychodzacy t = new TransportPrzychodzacy();
            t.setRzeczywistaData(losujDatePrzybycia());

            k.setNumerRozpoznawczy("K_"+nextId);
            nextId++;
            k.setTransportDostarczenie(t);
            k.setParametryPrzeznaczenie(new ParametryPrzeznaczenie(losujMiejsce(), minPrzybycie));

            k.setStatus(StatusObiektu.NIEZNANY);

            wynik.add(k);
        }

        return wynik;
    }

//   private List<TransportWychodzacy> generujTransportyWychodzace()
//   {
//       TransportWychodzacy transport = new TransportWychodzacy();
//
//
//       Pociag pojazd = new Pociag("P_Amsterdam_1");
//       Wagon wagon = new Wagon(pojazd, 1, 2);
//       wagon.getZawartoscWagonu().odtworz(null)
//       pojazd.dodajWagon(1, 2, null)
//
//
//       transport.setSrodekTransportu(null);
//   }

    private Date losujDatePrzybycia()
    {
        Random r = new Random();
        long min = minPrzybycie.getTime();
        long max = maxPrzybycie.getTime();

        long przedzial = max-min;

        int dodatek = r.nextInt((int)przedzial);

        return new Date(min+dodatek);
    }

    private String losujMiejsce()
    {
        Random r = new Random();
        int indeks = r.nextInt(model.getPorty().size());

        return model.getPorty().get(indeks);
    }

    /**
     * @param minPrzybycie the minPrzybycie to set
     */
    public void setMinPrzybycie(Date minPrzybycie) {
        this.minPrzybycie = minPrzybycie;
    }

    /**
     * @param maxPrzybycie the maxPrzybycie to set
     */
    public void setMaxPrzybycie(Date maxPrzybycie) {
        this.maxPrzybycie = maxPrzybycie;
    }

}
